type Concat<T extends Array<unknown>, U extends Array<unknown>> = [...T, ...U];

type A = Concat<[1, 2], [3, 4]>;

// 去除R1 first tail
type R1 = [1, 2, 3];

type First1<T> = T extends [infer First, ...infer Rest] ? First : never;

type Tail<T> = T extends [...infer Rest, infer Tail] ? Tail : never;

type F1 = First1<R1>; // 1

type T2 = Tail<R1>; // 3
